home *** CD-ROM | disk | FTP | other *** search
/ Language/OS - Multiplatform Resource Library / LANGUAGE OS.iso / pcr / pcr4_4.lha / DIST / loading / StripXSubsecs.c < prev    next >
C/C++ Source or Header  |  1990-10-03  |  3KB  |  129 lines

  1. /*
  2.  * StripXSubsecs.c
  3.  *
  4.  * Demers, October 2, 1990 10:12:27 am PDT
  5.  */
  6.  
  7. #include <stdio.h>
  8. #include <errno.h>
  9. #include <sys/types.h>
  10. #include <fcntl.h>
  11. #include <sys/file.h>
  12.  
  13. #include <xr/ADotOutExtrasAccess.h>
  14.  
  15.  
  16. int
  17. MyLSeekProc(offset, whence, fd)
  18.     int offset, whence, fd;
  19. {
  20.     int ans = lseek(fd, offset, whence);
  21.     return ((ans == -1) ? -errno : ans );
  22. }
  23.  
  24. int
  25. MyFTruncateProc(offset, whence, fd)
  26.     int offset, whence, fd;
  27. {
  28.     int ans;
  29.     if( whence != L_SET ) return (-EINVAL);
  30.     ans = ftruncate(fd, offset);
  31.     return ((ans == -1) ? -errno : ans );
  32. }
  33.  
  34.  
  35. int
  36. MyReadProc(buf, bytes, fd)
  37.     char *buf;
  38.     int bytes, fd;
  39. {
  40.     int ans = read(fd, buf, bytes);
  41.     return ((ans == -1) ? -errno : ans );
  42. }
  43.  
  44. int
  45. MyWriteProc(buf, bytes, fd)
  46.     char *buf;
  47.     int bytes, fd;
  48. {
  49.     int ans = write(fd, buf, bytes);
  50.     return ((ans == -1) ? -errno : ans );
  51. }
  52.  
  53.  
  54. int global_argc = 0;
  55. char **global_argv = NULL;
  56. int vflag = 0;
  57.  
  58. Usage()
  59. {
  60.     printf("Usage: %s [-v] [-m magic] objFileName\n", global_argv[0]);
  61.     exit(1);
  62. }
  63.  
  64. ReportError(fmt, x1, x2, x3)
  65.     char *fmt;
  66.     int x1, x2, x3;
  67. {
  68.     printf("\n%s: error: ", global_argv[0]);
  69.     printf(fmt, x1, x2, x3);
  70.     putchar('\n');
  71.     Usage();
  72. }
  73.  
  74.  
  75. void
  76. main(argc, argv)
  77.     int argc;
  78.     char **argv;
  79. {
  80.     int objfd;
  81.     char *objfn;
  82.     int i;
  83.     int ans;
  84.  
  85.     global_argc = argc;
  86.     global_argv = argv;
  87.  
  88.     if( argc < 2 ) Usage();
  89.  
  90.     objfn = argv[argc-1];
  91.     argc -= 1;
  92.     if( access(objfn, R_OK|W_OK) != 0 )
  93.         ReportError("can't write %s\n", objfn, 0, 0);
  94.     i = 1;
  95.     while( i < argc ) {
  96.         if( strcmp(argv[i], "-v") == 0 ) {
  97.              vflag = 1;
  98.              i += 1;
  99.              continue;
  100.         }
  101.         if( (i+1) >= argc ) {
  102.             ReportError("%s: wrong # args\n", argv[i], 0, 0);
  103.         }
  104.         if( strcmp(argv[i], "-m") == 0 ) {
  105.             (void)XR_SetADotOutExtraMagic(atoi(argv[i+1]));
  106.             i += 2;
  107.             continue;
  108.         }
  109.         ReportError("bad flag %s\n", argv[i]);
  110.     }
  111.     if( vflag ) {
  112.         printf("Stripping %s ... \n", objfn);
  113.     }
  114.     objfd = open(objfn, O_RDWR, 0);
  115.     if( objfd == -1 )
  116.         ReportError("can't open %s\n", objfn);
  117.     ans = XR_DeleteAllExtraSubsecs(
  118.             MyLSeekProc, MyReadProc, MyWriteProc, MyFTruncateProc, objfd );
  119.     if( ans < 0 ) {
  120.         ReportError("can't delete subsecs from %s, err %d",
  121.                 objfn, (-ans), 0 );
  122.     }
  123.     if( vflag ) {
  124.         printf("  done.\n");
  125.     }
  126.     (void)close(objfd);
  127.     exit(0);
  128. }
  129.